<?php

/**
 *
 *
 */
abstract class Kernel_Util_Tree
{
    /**
     * Преобразует набор записей вида id => parent_id в древовидный массив.
     *
     */
    static public function convert($set)
    {
        // создаем временыный корень дерева. вообще он нам не надо
        $root = array('id' => 0);

        // добавляем в дерево элементы меню
        self::_addToTree($set, $root);

        // возвращаем массив "детей корня", т.е. элементов первого уровня со
        // вложенными элементами
        return $root['children'];
    }

    /**
     * Добавляет элементы в узел.
     *
     * @param   array   $stack
     * @param   array   $node
     */
    static private function _addToTree($stack, &$node)
    {
        $children = array();

        foreach ($stack as $child)
        {
            if ($child['parent_id'] == $node['id'])
            {
                self::_addToTree($stack, $child);

                if ($child['active'])
                {
                    $node['active'] = true;
                }

                $children[] = $child;
            }
        }

        // присоединяем вложенные узлы к корню
        $node['children'] = $children;

        // удаляем вспомогательные атрибуты
        unset($node['id']);
        unset($node['parent_id']);
    }
}